#include <stdio.h>
#include <signal.h>
#include <iostream>
#include <unistd.h>
//进程是如何识别信号的 pcb里面有 block pending handler 这三个表，通过修改这三个表的位图 ,来实现信号的识别
//以下是具体的例子
void PrintPending(sigset_t & pending)
{
    std::cout<<"[pid:"<<getpid()<<"]"<<"pending list";
    //sigismember 函数 此函数用于检查一个指定的信号是否在给定的信号集中,也就是检查该信号是否被阻塞
    for(int signo=31;signo>0;signo--)
    {
        if(sigismember(&pending,signo))
        {
            std::cout<<"1";
        }
        else
        {
             std::cout<<"0";
        }
    }
    std::cout<<"\r\n";
}
void handler(int signo)
{
    std::cout << "我获取到了: " << signo << " 信号" << std::endl;
    // 不要让进程终止
    // 在对2号信号捕捉的代码中，获取pending && 打印？？
    sigset_t pending;
    sigemptyset(&pending);
    // 2.1 获取当前进程的pending信号集
    sigpending(&pending);

    // 2.2 不断打印所有的pending信号集中的信号
    std::cout << "###########################" << std::endl;
    PrintPending(pending);
    std::cout << "###########################" << std::endl;
}

int main()
{
    //0.设计处理信号的动作
    signal(2,handler);
    //1.屏蔽二号信号 
    //int sigprocmask(int how,const sigset_t* set,sigset_t* oldset)
    //初始化
    sigset_t set;
    sigemptyset(&set);
    sigset_t old;
    sigemptyset(&old);
    sigaddset(&set, SIGINT);//屏蔽二号信号
    sigprocmask(SIG_SETMASK,&set,&old);
    int cnt=10;
    while(true)
    {
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);//获取pending里面的内容
        //2.不断打印pending里面的信号集
        PrintPending(pending);
        cnt--;
        if(cnt==0)
        {
            //解除对信号2的屏蔽
            std::cout<<"接触对2号信号的屏蔽l"<<std::endl;
            sigprocmask(SIG_SETMASK,&old,nullptr);
        }
        sleep(1);
    }
   

    return 0;
}